Lightweight theme switching
authorRaymond Penners <pennersr@src.gnome.org>
Tue, 7 Oct 2003 19:58:28 +0000 (19:58 +0000)
committerRaymond Penners <pennersr@src.gnome.org>
Tue, 7 Oct 2003 19:58:28 +0000 (19:58 +0000)
modules/engines/ms-windows/ChangeLog.old
modules/engines/ms-windows/wimp_style.c
modules/engines/ms-windows/wimp_theme_main.c
modules/engines/ms-windows/xp_theme.c
modules/engines/ms-windows/xp_theme.h

index 68c759c6477742ac4e301d727a4bebab94be450c..fb42edb47f88274109c3115a2c30afc91e713bd2 100755 (executable)
@@ -1,3 +1,13 @@
+2003-10-07  Raymond Penners  <raymond@dotsphinx.com>\r
+\r
+       * src/wimp_style.c: Tabs not located on top of the notebook are\r
+       now (again) no longer rendered using XP theming.\r
+       \r
+       * src/xp_theme.c: Added a more lightweight method to cope with\r
+       theme changes. Added a crude theme switch detection scheme in the\r
+       case that GTK+ does not implement gdk_window_add_filter properly\r
+       (GTK+ 2.2.0?).\r
+       \r
 2003-10-07  Dom Lachowicz <cinamod@hotmail.com>\r
 \r
        * Added new mingw based build system, tidied up other missing bits\r
@@ -5,9 +15,12 @@
 2003-10-07  Raymond Penners  <raymond@dotsphinx.com>\r
 \r
        * src/wimp_style.c: Tabs not located on top of the notebook are\r
-       now (again) no longer rendered using XP theming. \r
+       now (again) no longer rendered using XP theming.\r
        \r
-       * src/xp_theme.c: We now properly use IsThemeActive().\r
+       * src/xp_theme.c: We now properly use IsThemeActive(). Added a\r
+       more lightweight method to cope with theme changes. Added a crude\r
+       theme switch detection scheme in the case that GTK+ does not\r
+       implement gdk_window_add_filter properly (GTK+ 2.2.0?).\r
        \r
        * src/xp_theme_defs.h: Renamed from xp_theme_dfns.h\r
 \r
index d3e3c6038be4a239a1211f33aa48ac785cfdcb95..8595a278957c8c64d33bebb1d9d87feb1528b2dd 100755 (executable)
@@ -1113,6 +1113,7 @@ draw_box (GtkStyle      *style,
       else
         {
           gboolean is_default = !strcmp (detail, "buttondefault");
+          g_warning("BUTT");
           if (xp_theme_draw(window, is_default ? XP_THEME_ELEMENT_DEFAULT_BUTTON
                             : XP_THEME_ELEMENT_BUTTON, style, x, y,
                             width, height, state_type, area))
index 64ef40201c743cd026cb2bfc292119d0601b5f0a..4d77a87011eaa6985a628508a8142b438636f086 100755 (executable)
@@ -49,7 +49,7 @@ global_filter_func (void     *xevent,
       /* catch theme changes */\r
     case WM_THEMECHANGED:\r
     case WM_SYSCOLORCHANGE:\r
-      xp_theme_exit();\r
+      xp_theme_reset ();\r
       wimp_style_init ();\r
 \r
       /* force all gtkwidgets to redraw */\r
index 7b8cbeba909fbada22b2e3191f07ee3723bd200b..68ced71717097e813bd868714e636041bdfa5a8f 100755 (executable)
@@ -118,8 +118,25 @@ static DrawThemeBackgroundFunc draw_theme_background_func = NULL;
 static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;
 static IsThemeActiveFunc is_theme_active_func = NULL;
 
+static  gboolean was_theming_active = FALSE;
+
+static void
+xp_theme_close_open_handles (void)
+{
+  int i;
+  
+  for (i=0; i < XP_THEME_CLASS__SIZEOF; i++)
+    {
+      if (open_themes[i])
+        {
+          close_theme_data_func (open_themes[i]);
+          open_themes[i] = NULL;
+       }
+    }
+}
+
 void
-xp_theme_init(void)
+xp_theme_init (void)
 {
   if (uxtheme_dll)
     return;
@@ -133,25 +150,30 @@ xp_theme_init(void)
   draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground");
   enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture");
   get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont");
+
+  if (is_theme_active_func)
+    {
+      was_theming_active = (*is_theme_active_func) ();
+    }
 }
 
+
 void
-xp_theme_exit(void)
+xp_theme_reset (void)
+{
+  xp_theme_close_open_handles ();
+  was_theming_active = (*is_theme_active_func) ();
+}
+
+void
+xp_theme_exit (void)
 {
-  int i;
   if (! uxtheme_dll)
     return;
 
-  for (i=0; i < XP_THEME_CLASS__SIZEOF; i++)
-    {
-      if (open_themes[i])
-        {
-          close_theme_data_func(open_themes[i]);
-          open_themes[i] = NULL;
-       }
-    }
+  xp_theme_close_open_handles ();
 
-  FreeLibrary(uxtheme_dll);
+  FreeLibrary (uxtheme_dll);
   uxtheme_dll = NULL;
 
   is_theme_active_func = NULL;
@@ -163,7 +185,7 @@ xp_theme_exit(void)
 }
 
 static HTHEME
-xp_theme_get_handle_by_class(XpThemeClass klazz)
+xp_theme_get_handle_by_class (XpThemeClass klazz)
 {
   if (!open_themes[klazz] && open_theme_data_func)
     {
@@ -173,7 +195,7 @@ xp_theme_get_handle_by_class(XpThemeClass klazz)
 }
 
 static HTHEME
-xp_theme_get_handle_by_element(XpThemeElement element)
+xp_theme_get_handle_by_element (XpThemeElement element)
 {
   HTHEME ret = NULL;
   XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;
@@ -266,7 +288,7 @@ xp_theme_get_handle_by_element(XpThemeElement element)
 }
 
 static int
-xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state)
+xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state)
 {
   int ret;
 
@@ -580,9 +602,9 @@ xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state)
 }
 
 gboolean
-xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,
-              int x, int y, int width, int height, GtkStateType state_type,
-             GdkRectangle *area)
+xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
+               int x, int y, int width, int height,
+               GtkStateType state_type, GdkRectangle *area)
 {
   HTHEME theme;
   RECT rect, clip, *pClip;
@@ -643,17 +665,32 @@ xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,
 }
 
 gboolean
-xp_theme_is_drawable(XpThemeElement element)
+xp_theme_is_drawable (XpThemeElement element)
 {
-  if (is_theme_active_func && (*is_theme_active_func)())
+  gboolean ret = FALSE;
+  
+  if (is_theme_active_func)
     {
-      return (xp_theme_get_handle_by_element(element) != NULL);
+      gboolean active = (*is_theme_active_func) ();
+      // A bit of a hack, but it at least detects theme
+      // switches between XP and classic looks on systems
+      // using older GTK+ version (2.2.0-?) that do not
+      // support theme switch detection (gdk_window_add_filter).
+      if (active != was_theming_active)
+        {
+          xp_theme_reset ();
+        }
+      
+      if (active)
+        {
+          ret = (xp_theme_get_handle_by_element (element) != NULL);
+        }
     }
-  return FALSE;
+  return ret;
 }
 
 gboolean
-xp_theme_get_system_font(int fontId, LOGFONT *lf)
+xp_theme_get_system_font (int fontId, LOGFONT *lf)
 {
   if (get_theme_sys_font_func != NULL)
     {
index e877e075d929a219d4ff21e7bd4f4ebe5d1cdb50..554f179c5520283d4cadb7843ed06c43e2759355 100755 (executable)
@@ -85,12 +85,14 @@ typedef enum
   XP_THEME_ELEMENT__SIZEOF\r
 } XpThemeElement;\r
 \r
-void xp_theme_init(void);\r
-void xp_theme_exit(void);\r
-gboolean xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,\r
-                       int x, int y, int width, int height, GtkStateType state_type,\r
-                      GdkRectangle *area);\r
-gboolean xp_theme_is_drawable(XpThemeElement element);\r
-gboolean xp_theme_get_system_font(int fontId, LOGFONT *lf);\r
+void xp_theme_init (void);\r
+void xp_theme_reset (void);\r
+void xp_theme_exit (void);\r
+gboolean xp_theme_draw (GdkWindow *win, XpThemeElement element,\r
+                        GtkStyle *style, int x, int y, int width,\r
+                        int height, GtkStateType state_type,\r
+                        GdkRectangle *area);\r
+gboolean xp_theme_is_drawable (XpThemeElement element);\r
+gboolean xp_theme_get_system_font (int fontId, LOGFONT *lf);\r
 \r
 #endif /* XP_THEME_H */\r